home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.5 / pascal / pcq-programme / dxboot / dxboot.p < prev    next >
Text File  |  1995-04-19  |  9KB  |  379 lines

  1. Program DxBoot;
  2.  
  3. {$I "include:exec/Exec.i"       }
  4. {$I "include:exec/IO.i"     }
  5. {$I "include:Utils/IOUtils.i"}
  6. {$I "include:libraries/dos.i"}
  7. {$I "include:utils/stringlib.i"}
  8. {$I "include:utils/parameters.i"}
  9.  
  10. CONST
  11.     CMD_MOTOR : Short = 9;        { ist nicht in execIO.i def., }
  12.  
  13.  
  14.     CMD__Null   : Short = 0;
  15.     CMD__Kill   : Short = 1;
  16.     CMD__Read   : Short = 2;
  17.     CMD__Write  : Short = 3;
  18.     CMD__Chk    : Short = 4;
  19.     CMD__Boot   : Short = 5;
  20.     CMD__Cmp    : Short = 6;
  21.     CMD__Type   : Short = 7;
  22.     CMD__Help   : Short = 8;
  23.  
  24.     on        = 1;
  25.     off      = 0;
  26.     dev        : String = "trackdisk.device";
  27.  
  28.     ErrorTD_IO : String = " Error on trackdisk-IO\n";
  29.     DosErr_Rf  : String = " Error reading file\n";
  30.     DosErr_Wf  : String = " Error writing file\n";
  31.  
  32.  
  33.  
  34. Type
  35.     BB    = Array[0..1023] Of Byte;
  36.     BBPtr = ^BB;
  37.  
  38. VAR
  39.     comm,
  40.     i        : Short;
  41.     ok,
  42.     dfx      : Integer;
  43.     ArgStr,
  44.     ExitStr  : String;
  45.     Handle   : FileHandle;
  46.     BB1,
  47.     BB2      : BBPtr;
  48.  
  49.  
  50.  
  51.  
  52. { --- Zum sauberen Verlassen des Programms, egal, von wo ! --- }
  53.  
  54. Procedure Cleanexit(why : String; RT : Integer);
  55. Begin
  56.     IF handle <>NIL then DOSClose(handle);  { --- File schließen --- }
  57.     IF BB1    <>NIL then FreeMem(BB1,1024); { --- ChipMem freigeben --- }
  58.  
  59.     IF why<>NIL then begin
  60.       writeln(why);
  61.       If RT=5 then write("\nUsage : DxBoot cmd unit[0..3] <filename>\n",
  62.                   "Type    DxBoot ? for help\n\n");
  63.       Delay(100);    { --- 2 s warten --- }
  64.     end;
  65.     Exit(RT);
  66. End;
  67.  
  68.  
  69. { --- HexDump des BB`s ausgeben --- }
  70.  
  71. Procedure DumpBB;
  72.  
  73. Const
  74.     hex  : ARRAY[0..15] OF Char =  ('0123456789ABCDEF');
  75.  
  76. Var
  77.     BW  : Byte;
  78.     k,j : Short;
  79.     Buf : String;    
  80.  
  81. Begin
  82.  
  83.       k:=0;                { --- Setup --- }
  84.       Buf:=AllocString(70);
  85.  
  86.       Buf[48]:=' ';        { --- Leerzeichen --- }
  87.       Buf[49]:=' ';
  88.       Buf[66]:=chr(10);        { --- Return & linefeed --- }
  89.       Buf[67]:=chr(0);        { --- Abschlußbyte f. Strings = 0 --- }
  90.  
  91.       For i:=1 to 64 Do BEGIN        { --- 64 Zeile zu 16 Bytes --- }
  92.     For j:=0 to 15 Do Begin
  93.       BW:=BB1^[k];
  94.       Buf[j*3]:=' ';        { --- Leerzeichen --- }
  95.       Buf[j*3+1]:=hex[BW DIV 16];    { --- Byte-hälfte high ---}
  96.       Buf[j*3+2]:=hex[BW MOD 16];    { --- Byte-hälfte low  --- }
  97.  
  98.       IF ((BW > 31) AND (BW < 123)) then
  99.         Buf[50+j]:=chr(BW)
  100.       ELSE                { --- Ggf. (A..z) --- }
  101.         Buf[50+j]:='.';        { --- sonst   .   --- }
  102.  
  103.           inc(k);            { --- k  um 1 erhöhen --- }
  104.     End;
  105.       write(Buf);            { --- Zeile ausgeben --- }
  106.       End;
  107. end;
  108.  
  109.  
  110.  
  111. Procedure Instant13BB(bbm : BBPtr);    { --- Trägt in bbm^ einen 1.3-BB ein --- }
  112.  
  113. Const
  114.     BB13 : ARRAY[0..48] OF Byte = ( $44, $4F, $53, $00, $C0, $20, $0F, $19,
  115.                     $00, $00, $03, $70, $43, $FA, $00, $18,
  116.                     $4E, $AE, $FF, $A0, $4A, $80, $67, $0A,
  117.                     $20, $40, $20, $68, $00, $16, $70, $00,
  118.                     $4E, $75, $70, $FF, $60, $FA, $64, $6F,
  119.                     $73, $2E, $6C, $69, $62, $72, $61, $72,
  120.                     $79, );
  121. Var
  122.     j   : short;
  123. Begin
  124.     for j:=0 to 48 do  bbm^[j]:=BB13[j];    { --- 1.3-BB kopieren --- }
  125.     for j:=49 to 1023 do  bbm^[j]:=0;    { --- mit 0 auffüllen --- }
  126. End;
  127.  
  128.  
  129.     { --- Bootblock-Ein/Ausgabe --- }
  130.  
  131. Function RWBB(unit: Integer; cmd: Short; mem: Address):Boolean;
  132.  
  133.  
  134. PROCEDURE Motor(iostdr:IOStdReqPtr; switch:Integer);
  135. Var                            { dfx-Motor an/aus }
  136.     okm : Integer;
  137. BEGIN
  138.   iostdr^.io_Command:=CMD_MOTOR;            { Motor schalten   }
  139.   iostdr^.io_Length:=switch;                { on/off übergeben }
  140.   okm:=DoIO(iostdr);                    { GO ! }
  141. END;    { Motor }
  142.  
  143.  
  144.  
  145. Var
  146.     myReq    : IOStdReqPtr;
  147.     myPort   : MsgPortPtr;
  148.     myMem    : Address;
  149.  
  150.  
  151. Begin
  152.     myPort:=CreatePort(NIL,0);        { Nachrichtenport des Laufwerks }
  153.     myReq:=CreateStdIO(myPort);        { Kommunikationsport einrichten }
  154.  
  155.     ok:=OpenDevice(dev,unit,myReq,0);    { TrackDisk öffnen }
  156.  
  157.     IF ok=0 THEN BEGIN
  158.  
  159.       With myReq^ do begin
  160.         io_Data    := mem;            { Speicherbereich }
  161.         io_Offset  := 0;            { Offset = Block 0 }
  162.         io_Length  := 1024;            { 1024 bytes }
  163.         io_Command := CMD_CLEAR;        { zuerst Trackbuffer löschen }
  164.       end;
  165.  
  166.       ok:=DoIO(myReq);
  167.       If ok=0 then begin            { wenn gelöscht, dann }
  168.  
  169.         myReq^.io_command := cmd;        { BB schreiben/lesen  }
  170.         ok:=DoIO(myReq);
  171.  
  172.         If (ok=0) AND (cmd    =CMD__Write) then begin
  173.           myReq^.io_Command := CMD_UPDATE;
  174.           ok:=DoIO(myReq);            { zum Schreiben "updaten" }
  175.         end;                { d.h. Trackbuffer -> Disk }
  176.  
  177.       end;
  178.  
  179.       Motor(myReq,off);            { Motor aus & fertig }
  180.  
  181.       CloseDevice(myReq);            { Device schließen   }
  182.       DeleteStdIO(myReq);            { IOReq entfernen    }
  183.       DeletePort(myPort);            { MsgPort entfernen  }
  184.  
  185.       If ok=0 then RWBB:=TRUE else RWBB:=False;
  186.  
  187.     End Else RWBB:=FALSE;
  188.  
  189. End;
  190.  
  191.  
  192. { --- File-Ein/Ausgabe --- }
  193.  
  194. Function FileIO(cmd: Short; hdl: FileHandle; mem: Address): Boolean;
  195. Begin
  196.     CASE cmd of
  197.     Cmd__Read  :    ok:=DOSRead(hdl,mem,1024);
  198.     Cmd__Write :    ok:=DOSWrite(hdl,mem,1024);
  199.     END;
  200.  
  201.     IF ok<>1024
  202.     then FileIO:=False
  203.     else FileIO:=True;
  204. End;
  205.  
  206.  
  207. { --- File je nach Bedarf öffnen, zur Ein/Ausgabe --- }
  208.  
  209. Procedure OpenFile(Mode: Integer);
  210. begin
  211.     GetParam(3,ArgStr);
  212.     If strlen(ArgStr)=0 then Cleanexit(" No filename",5);
  213.  
  214.     handle:=DosOpen(ArgStr, Mode);
  215.     If handle=NIL then CleanExit(" Could not open IO-File\n",10);
  216. end;
  217.  
  218.  
  219.  
  220. --------------------  MAIN  ----------------------- }
  221.  
  222.  
  223.  
  224. BEGIN
  225.   write(" DxBoot 1.1a, (C)1992 by Diesel. \n It`s Freeware!\n\n");
  226.   ArgStr:=AllocString(100);
  227.  
  228.  
  229.   { --- Kommando holen --- }
  230.  
  231.   GetParam(1,ArgStr);
  232.   If strlen(ArgStr)=0 then CleanExit(" No Args",5);
  233.  
  234.  
  235.   { --- nach a..z konvertieren --- }
  236.  
  237.   for i:=0 to strlen(ArgStr)-1 do
  238.     ArgStr[i]:=tolower(ArgStr[i]);
  239.  
  240.  
  241.   { --- Check, ob zulässiges Kommando --- }
  242.  
  243.   comm:=Cmd__Null;
  244.  
  245.   If strcmp(ArgStr,"read")=0    then comm:=Cmd__Read;
  246.   If strcmp(ArgStr,"write")=0    then comm:=Cmd__Write;
  247.   If strcmp(ArgStr,"chk")=0    then comm:=Cmd__Chk;
  248.   If strcmp(ArgStr,"boot")=0    then comm:=Cmd__Boot;
  249.  
  250.   If strcmp(ArgStr,"cmp")=0    then comm:=Cmd__Cmp;
  251.   If strcmp(ArgStr,"type")=0    then comm:=Cmd__Type;
  252.   If strcmp(ArgStr,"kill")=0    then comm:=Cmd__Kill;
  253.   If strcmp(ArgStr,"?")=0    then comm:=Cmd__Help;
  254.  
  255.   If comm=Cmd__Null then cleanexit(" Not valid command",5);
  256.  
  257.  
  258.   { --- unit holen / df0..df3 = 0..3 --- }
  259.  
  260.   If comm<>CMD__Help then begin
  261.     GetParam(2,ArgStr);
  262.     IF StrLen(ArgStr)=0 THEN CleanExit(" No Unit# [0..3]",5)
  263.     else begin
  264.       Case Byte(ArgStr^) of
  265.     48 : dfx := 0;
  266.     49 : dfx := 1;
  267.     50 : dfx := 2;
  268.     51 : dfx := 3;
  269.       Else
  270.     CleanExit(" Not valid unit number !",5);
  271.       End;
  272.     end;
  273.   End;
  274.  
  275.  
  276.   { --- Ggf. File zum Schreiben/Lesen öffnen --- }
  277.  
  278.   Case comm of
  279.     Cmd__Write,
  280.     Cmd__Cmp    : OpenFile(Mode_OldFile);
  281.     Cmd__Read    : OpenFile(Mode_NewFile);
  282.   End;
  283.  
  284.  
  285.   { --- 1 K Chip-RAM reservieren : --- }
  286.  
  287.   BB1:=BBPtr(AllocMem(1024,Memf_Chip));
  288.   If BB1=NIL then CleanExit(" Low on Chipmem !\n",10);
  289.  
  290.  
  291.   { --- zus. 1 K RAM f. Vergleichs-BB o.ä. --- }
  292.  
  293.   New(BB2);
  294.  
  295.  
  296.   { --- Kommando ausführen : --- }
  297.  
  298.   Case comm of
  299.     CMD__Read :        { --- BB speichern --- }
  300.     begin
  301.     If not (RWBB(dfx, CMD__Read, BB1))        then Cleanexit(ErrorTD_IO,10);
  302.     If not (FileIO(CMD__Write, handle, BB1))  then CleanExit(DosErr_Wf, 10);
  303.     end;
  304.  
  305.     CMD__Write :    { --- install  BB from file --- }
  306.     begin
  307.     If not (FileIO(CMD__Read, handle, BB1))   then CleanExit(DosErr_Rf ,10);
  308.     If not (RWBB(dfx, CMD__Write, BB1))       then Cleanexit(ErrorTD_IO,10);
  309.     end;
  310.  
  311.     CMD__Chk :        { --- check if 1.3-BB --- }
  312.     begin
  313.     Instant13BB(BB2);;
  314.     If not (RWBB(dfx, CMD__Read, BB1))        then Cleanexit(ErrorTD_IO,10);
  315.     For i:=0to 1023 do
  316.       If bb1^[i]<>bb2^[i]               then CleanExit(" No 1.3-BB!!\n",10);
  317.  
  318.     CleanExit(" BB ok ( 1.3-BB)\n",0);
  319.     End;
  320.  
  321.     CMD__Boot :        { --- install original 1.3-BB --- }
  322.     begin
  323.     Instant13BB(BB1);
  324.     If not (RWBB(dfx, CMD__Write, BB1))       then Cleanexit(ErrorTD_IO,10);
  325.     End;
  326.  
  327.  
  328.     CMD__Cmp :        { --- BB vergleichen --- }
  329.     begin
  330.     If not (RWBB(dfx, CMD__Read, BB1))        then Cleanexit(ErrorTD_IO,10);
  331.     If not (FileIO(CMD__Read, handle, BB2))   then CleanExit(DosErr_Rf, 10);
  332.  
  333.     For i:=0 to 1023 Do
  334.       Begin
  335.       If BB1^[i]<>BB2^[i] then
  336.         begin
  337.         write(" BB -NOT- equal 2 file\n\n");
  338.         CleanExit(NIL,10);
  339.         end;
  340.       end;
  341.     write(" BB equal 2 file\n\n");
  342.     Cleanexit(NIL,0);
  343.     end;
  344.  
  345.     CMD__Type :        { --- HexDump(BB) --- }
  346.     begin
  347.     If not (RWBB(dfx, CMD__Read, BB1))        then Cleanexit(ErrorTD_IO,10);
  348.     DumpBB;
  349.     end;
  350.  
  351.     CMD__Kill :        { --- Install -> NDOS --- }
  352.     begin
  353.     For i:=0 to 1023 do
  354.       BB1^[i]:=0;
  355.  
  356.     If not (RWBB(dfx, CMD__Write, BB1))       then Cleanexit(ErrorTD_IO,10);
  357.     end;
  358.  
  359.     CMD__Help :        { --- How 2 use it --- }
  360.     begin
  361.     write(    "Usage : DxBoot cmd unit[0..3] <filename>\n",
  362.         "Available commands are:\n",
  363.         " read  [unit#] BBfile    2 save a BootBlock\n",
  364.         " write [unit#] BBFile    2 install a BB\n",
  365.         " chk   [unit#]        2 check if 1.3-BB\n",
  366.         " boot  [unit#]        2 install a 1.3-BB\n",
  367.         " cmp   [unit#] BBFile    2 cmp 2 a BB-file\n",
  368.         " type  [unit#]      4 a hexdump\n",
  369.         " kill  [unit#]      2 get a NDOS-Disk\n",
  370.         " ?     [unit#]      4 help\n\n");
  371.     end;
  372.   END;
  373.  
  374.   Cleanexit(NIL,0);    { --- Bye !! --- }
  375.  
  376. END.                    { bye bye GTI ...}
  377.  
  378.  
  379.